<?php

class Solicitudes_Model_DbTable_Procesos extends Zend_Db_Table_Abstract {
	
	protected $_name = 'procesos';
	protected $_primary = 'codproceso';
	protected $_sequence = 'seq_procesos';
	//protected $_rowClass = 'App_Audit_Row'; //no se necesita que se audite
	
	public function getProcesosIES($codinstitucion) {
		/*
	    $select = $this->select(self::SELECT_WITH_FROM_PART)
						->joinUsing("invitados_sesiones_cna", "codinvitado", null)
						->where("codsesion=?",$codsesion)->order("nombre");
		$select->setIntegrityCheck(false);*/
	    $select = $this->select(self::SELECT_WITH_FROM_PART)
	                   ->where("codinstitucion=?",$codinstitucion)->order("nombreprograma");
		return $select->query()->fetchAll();
	}
	
	public function asignarProgramasSolicitud($programas, $tiposolicitud, $fecha){
		$this->getAdapter()->beginTransaction();
		try {
		    $datos_historico["codusuario"] = App_User::getCodigoUsuario();
//		    $datos_historico["codestado"] = Solicitudes_Model_Historicoprocesos::CONDICIONES_INICIALES;
//
//		    if (in_array($tiposolicitud,array(2,4))){
		    $datos_historico["codestado"] = Solicitudes_Model_Historicoprocesos::APROBADO_AUTOEVALUACION;
//		    }
		    $serviceHistorico = new Solicitudes_Model_Historicoprocesos();
		    $serviceSolicitudes = new Solicitudes_Model_Solicitudes();
		    $serviceProgramas = new Programas_Model_Programas();
		    
        	$datos_solicitud["tiposolicitud"] = $tiposolicitud;
		    $datos_proceso["codestado"] = $datos_historico["codestado"];
        	
			foreach ($programas as $codprograma) {
			    $datos_programa = $serviceProgramas->getPrograma($codprograma);
			    $datos_solicitud["codsede"] = $datos_programa["codsede"];
                $datos_proceso["codsolicitud"] = $serviceSolicitudes->guardarSolicitud($datos_solicitud);
			    $datos_proceso["codprograma"]  = $codprograma;
				$datos_historico["codproceso"] = $this->createRow($datos_proceso)->save();
				$serviceHistorico->guardarEstadoProceso($datos_historico["codproceso"],$datos_historico["codestado"],$fecha);
			}
			$sesionSolicitud = new Zend_Session_Namespace("SOLICITUD");
		    $sesionSolicitud->codsolicitud = $datos_proceso["codsolicitud"];
			
			$this->getAdapter()->commit();
			
		} catch(Exception $e) {
			$this->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	public function desasignarProgramasSolicitud($codsolicitud, $programas) {
	    $codprogramas = implode(",",$programas);
		$this->getAdapter()->delete("procesos","codsolicitud={$codsolicitud} AND codprograma IN ({$codprogramas})");
	}
	
    public function getProceso($codproceso) {
	    $select = $this->select(self::SELECT_WITH_FROM_PART)
	                    ->joinUsing("programas", "codprograma", array('codprograma','nombreprograma','codsnies'))
	                    ->join(array('m'=>'metodologias'),'programas.codmetodologia=m.codmetodologia',array('nombremetodologia'))
	                    ->join(array('n'=>'nivelacademico'),'programas.codnivel=n.codnivel',array('nombrenivel'))
	                    ->where('codproceso=?',$codproceso)
	                    ->order('programas.nombreprograma');
	    $select->setIntegrityCheck(false);
        //Zend_Debug::dump($select->__toString());
        return $select->query()->fetch();
	    //return $select->query();
	}
	
	public function getProcesosSolicitud($codsolicitud) {
	    $select = $this->select()
	                    ->from(array('c'=>'procesos'),array('codproceso'))
	                    ->join(array('g'=>'programas'),'c.codprograma=g.codprograma',array('codprograma','nombreprograma','codsnies'))
	                    ->join(array('m'=>'metodologias'),'g.codmetodologia=m.codmetodologia',array('nombremetodologia'))
	                    ->join(array('n'=>'nivelacademico'),'g.codnivel=n.codnivel',array('nombrenivel'))
	                    ->where('c.codsolicitud=?',$codsolicitud)
	                    ->order('g.nombreprograma');
	    $select->setIntegrityCheck(false);
//        Zend_Debug::dump($select->__toString());
	    return $select->query()->fetchAll();
	}
	
	public function getProcesos($criterio,$datos){
	    $select = $this->select()
	                   ->from(array('p'=>'procesos'),'')
	                   ->join(array('s'=>'solicitudes'),'s.codsolicitud=p.codsolicitud','s.tiposolicitud')
	                   ->join(array('e'=>'estadosprocesos'),'e.codestado=p.codestado','e.codestado,e.orden,e.nombre,count(p.codproceso) AS cantidad')
	                   ->group(array('s.tiposolicitud','e.orden','e.codestado','e.nombre'))
	                   ->order(array('e.orden','s.tiposolicitud'));
	    $select->setIntegrityCheck(false);
	    
        switch($criterio){
           case "SEDE":
               $select->where ("s.codsede=?",$datos["codsede"]);
	           if (isset($datos["tipousuario"]) && $datos["tipousuario"]!="A"){
                   $select->join(array("pu"=>"programasusuario"),"pu.codprograma=p.codprograma",NULL);
	               $select->where("pu.codusuario=?",$datos["codusuario"]);
               }

           break;
           case "PAR":
               $select->join (array('pp'=>'paresproceso_cna'),'pp.codproceso=p.codproceso','');
               $select->where ("p.codestado={$datos["codestado1"]} OR p.codestado={$datos["codestado2"]}");
               $select->where ("pp.codusuario=?",$datos["codusuario"]);
               $select->where ("pp.estadoaceptacionpar<>?",3);
           break;
           case "CONSEJERO":
               $select->where ("p.codproceso IN (SELECT pp.codproceso FROM paresproceso_cna pp WHERE pp.codproceso=p.codproceso AND
               				    (p.codestado IN ({$datos["codestado1"]},{$datos["codestado2"]},{$datos["codestado3"]},{$datos["codestado4"]})
               				   AND pp.codusuario={$datos["codusuario"]})
               				   OR {$datos["codusuario"]}=(SELECT ip.codconsejero FROM informeproceso_cna ip WHERE ip.codproceso=p.codproceso AND p.codestado IN ({$datos["codestado3"]},{$datos["codestado4"]})))
               ");
           break;
           case "VERIFICADOR":
               $select->where ("p.codproceso IN (SELECT pp.codproceso FROM paresproceso_cna pp WHERE pp.codproceso=p.codproceso
               				   AND p.codestado IN ({$datos["codestado1"]},{$datos["codestado2"]}) AND pp.subestado IN (4,5,6))");
           break;
           case "VIATICOSYHONORARIOS":
               $select->where ("p.codproceso IN (SELECT pp.codproceso FROM paresproceso_cna pp WHERE pp.codproceso=p.codproceso
               				   AND p.codestado={$datos["codestado1"]} AND pp.subestado IN (5,6))");
          break;
           case "COMPLETITUD":
                $select->where ("p.codestado IN ({$datos["codestado1"]},{$datos["codestado2"]})");
          break;
           case "MIGRACION":
               $select->join(array('g'=>'programas'),'g.codprograma=p.codprograma','');
               $select->where("g.codsnies={$datos["codsnies"]} AND s.tiposolicitud={$datos["tiposolicitud"]}");
               
               $select->join (array('hp'=>'historicoprocesos'),'hp.codproceso=p.codproceso','');
               $select->where("hp.fecha='{$datos["fechaestado"]}' AND hp.codestado=7");
          break;
	    }
	    
//	    Zend_Debug::dump($select->__toString());
	    
	    return $select->query()->fetchAll();
	}
	public function buscarInstalacionesFisicas($codproceso,$codestado) {
	    return $this->getAdapter()->fetchAll("SELECT * FROM instalacionesfisicasproceso_cna i WHERE i.codproceso='{$codproceso}' AND i.codestado='{$codestado}' ORDER BY i.codinstalacion,i.tipotenencia");
	}
	
	public function buscarDocentes($codproceso,$codestado) {
	    return $this->getAdapter()->fetchAll("SELECT * FROM docentesproceso_cna i WHERE i.codproceso='{$codproceso}' AND i.codestado='{$codestado}' ORDER BY i.tipodedicacion,i.tiponivel,i.ano,i.periodo");
	}
	
	public function buscarEstudiantes($codproceso,$codestado) {
	    return $this->getAdapter()->fetchAll("SELECT * FROM estudiantesproceso_cna i WHERE i.codproceso='{$codproceso}' AND i.codestado='{$codestado}' ORDER BY i.tipoestudiante,i.ano,i.periodo");
	}
	
	public function getCodprocesosSolicitud($codsolicitud) {
	    $select = $this->select()
	                    ->from(array('c'=>'procesos'),array('codproceso'))
	                    ->where('c.codsolicitud=?',$codsolicitud);
	    $select->setIntegrityCheck(false);
        //Zend_Debug::dump($select->__toString());
	    return $select->query()->fetchAll();
	}
}//fin de la clase
